package org.javaboy.demo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionVisitor;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    /**
     * 这个时候，BeanDefinition 已经有了，但是 Bean 还没生成了
     * @param beanFactory 这个参数就相当于是 Spring 容器了
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //这个就是获取 Spring 容器中所有的 BeanName
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }
        //这个位置去获取 Bean 的时候，按理说此时 Bean 还没有生成，但是当我们调用了 getBean 方法之后
        //会现场去生成这个 Bean，所以，如果我们需要提前初始化一个 Bean，就可以在这里完成。
        //正常来说，Spring 容器初始化之后，Bean 就初始化了，但是这个地方的初始化，比 Spring 容器默认的初始化更早
//        Object user = beanFactory.getBean("user");
//        System.out.println("user = " + user);
        //这个地方相当于去获取 user 这个 bean 的 beanDefinition
        BeanDefinition userBd = beanFactory.getBeanDefinition("user");
        //这个BeanDefinitionVisitor是一个专门用来访问 BeanDefinition 中属性的工具
        BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(strVal -> {
            if (strVal.equals("zhangsan")) {
                return "lisi";
            }
            return strVal;
        });
        //通过 visitor 去修改 userBd
        visitor.visitBeanDefinition(userBd);
        System.out.println("postProcessBeanFactory");
    }
}
